package com.h3c.nem.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.h3c.nem.async.AsyncSyncDataToHRSS;
import com.h3c.nem.client.AbilityClient;
import com.h3c.nem.client.SapClient;
import com.h3c.nem.dto.TbPersonnelRegisterMiddleDTO;
import com.h3c.nem.dto.beisen.PtEnumDTO;
import com.h3c.nem.entity.TbPersonnelRegisterMiddle;
import com.h3c.nem.mapper.TbPersonnelRegisterMiddleMapper;
import com.h3c.nem.service.CommService;
import com.h3c.nem.service.ITbPersonnelRegisterMiddleService;
import com.h3c.nem.utils.AppBusinessException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 实现类
 *
 * @author chenyifan
 * @since 2022-06-16 09:52:24
 */
@Service
public class TbPersonnelRegisterMiddleServiceImpl extends ServiceImpl<TbPersonnelRegisterMiddleMapper, TbPersonnelRegisterMiddle> implements ITbPersonnelRegisterMiddleService {

    @Autowired
    TbPersonnelRegisterMiddleMapper personnelRegisterMiddleMapper;

    @Autowired
    AbilityClient abilityClient;

    @Autowired
    CommService commService;

    @Autowired
    SapClient sapClient;

    @Autowired
    AsyncSyncDataToHRSS asyncSyncDataToHRSS;

    @Value("${ptability.token}")
    private String ptToken;

    @Value("${hrss.nem.account}")
    private String appId;

    @Value("${hrss.nem.password}")
    private String curSecret;


    @Override
    public String getRegistrationByPersonnelScope(String personnelScope) {
        TbPersonnelRegisterMiddle tbPersonnelRegisterMiddle = getOne(new QueryWrapper<TbPersonnelRegisterMiddle>().lambda()
                .eq(TbPersonnelRegisterMiddle::getPersonnelCode, personnelScope)
        );
        if (Objects.isNull(tbPersonnelRegisterMiddle)) {
            return "";
        }
        return tbPersonnelRegisterMiddle.getRegistration();
    }

    private String getSapToken() {
        return commService.getSapToken(appId, curSecret);
    }

    @Override
    public List<TbPersonnelRegisterMiddleDTO> selectFuzzyByDto(TbPersonnelRegisterMiddleDTO dto) {
        List<TbPersonnelRegisterMiddle> tbPersonnelRegisterMiddles = personnelRegisterMiddleMapper.selectList(new QueryWrapper<TbPersonnelRegisterMiddle>().lambda()
                .like(TbPersonnelRegisterMiddle::getPersonnelScope, dto.getPersonnelScope())
                .like(TbPersonnelRegisterMiddle::getCompanyName, dto.getCompanyName()));
        List<TbPersonnelRegisterMiddleDTO> personnelRegisterMiddleDTOList = tbPersonnelRegisterMiddles.stream().map(tbTbPersonnelRegisterMiddle -> {
            TbPersonnelRegisterMiddleDTO personnelRegisterMiddleDTO = new TbPersonnelRegisterMiddleDTO();
            BeanUtils.copyProperties(tbTbPersonnelRegisterMiddle, personnelRegisterMiddleDTO);
            return personnelRegisterMiddleDTO;
        }).collect(Collectors.toList());
        return personnelRegisterMiddleDTOList;
    }

    @Override
    public Integer insertDto(TbPersonnelRegisterMiddleDTO dto) {
        QueryWrapper<TbPersonnelRegisterMiddle> queryWrapper = Wrappers.query();
        queryWrapper.eq("personnel_scope", dto.getPersonnelScope());
        TbPersonnelRegisterMiddle tbPersonnelRegisterMiddle = personnelRegisterMiddleMapper.selectOne(queryWrapper);
        if (tbPersonnelRegisterMiddle != null) {
            throw new AppBusinessException("该条数据已存在，请重新输入");
        }
        tbPersonnelRegisterMiddle = new TbPersonnelRegisterMiddle();
        BeanUtils.copyProperties(dto, tbPersonnelRegisterMiddle);
        List<PtEnumDTO> personnelRangeEnum = getPersonnelRangeEnum();
        Map<String, String> enumMap = personnelRangeEnum.stream().collect(Collectors.toMap(PtEnumDTO::getNameZh, PtEnumDTO::getValue));
        tbPersonnelRegisterMiddle.setPersonnelCode(enumMap.get(dto.getPersonnelScope()));
        Integer num = personnelRegisterMiddleMapper.insert(tbPersonnelRegisterMiddle);
        //异步同步数据至HRSS
        String sapToken = getSapToken();
        asyncSyncDataToHRSS.saveCompanyRegistrationAddress(tbPersonnelRegisterMiddle, sapToken);
        return num;
    }

    @Override
    public Integer updateDto(TbPersonnelRegisterMiddleDTO dto) {
//        TbPersonnelRegisterMiddle personnelRegisterMiddle = getTbPersonnelRegisterMiddle(dto);
        TbPersonnelRegisterMiddle personnelRegisterMiddle = personnelRegisterMiddleMapper.selectOne(new QueryWrapper<TbPersonnelRegisterMiddle>().eq("id", dto.getId()));
        TbPersonnelRegisterMiddle tbPersonnelRegisterMiddle = new TbPersonnelRegisterMiddle();
        BeanUtils.copyProperties(dto, tbPersonnelRegisterMiddle);
        Integer num = personnelRegisterMiddleMapper.updateById(tbPersonnelRegisterMiddle);
        String sapToken = getSapToken();
        asyncSyncDataToHRSS.deleteCompanyRegistrationAddress(personnelRegisterMiddle, sapToken);
        asyncSyncDataToHRSS.saveCompanyRegistrationAddress(tbPersonnelRegisterMiddle, sapToken);
        return num;
    }

//    private TbPersonnelRegisterMiddle getTbPersonnelRegisterMiddle(TbPersonnelRegisterMiddleDTO dto) {
//        QueryWrapper<TbPersonnelRegisterMiddle> queryWrapper = Wrappers.query();
//        queryWrapper.eq("personnel_scope",dto.getPersonnelScope());
//        TbPersonnelRegisterMiddle personnelRegisterMiddle = personnelRegisterMiddleMapper.selectOne(queryWrapper);
//        if (personnelRegisterMiddle != null){
//            throw new AppBusinessException("该条数据已存在，请重新输入");
//        }
//        personnelRegisterMiddle = new TbPersonnelRegisterMiddle();
//        BeanUtils.copyProperties(dto, personnelRegisterMiddle);
//        return personnelRegisterMiddle;
//    }

    @Override
    public Integer deleteDto(TbPersonnelRegisterMiddleDTO dto) {
        Integer num = personnelRegisterMiddleMapper.deleteById(dto.getId());
        // todo  先不调
//        String sapToken = getSapToken();
        TbPersonnelRegisterMiddle tbPersonnelRegisterMiddle = new TbPersonnelRegisterMiddle();
        BeanUtils.copyProperties(dto, tbPersonnelRegisterMiddle);
        //异步删除HRSS中的数据  todo  先不调
//        asyncSyncDataToHRSS.deleteCompanyRegistrationAddress(tbPersonnelRegisterMiddle, sapToken);
        return num;
    }

    @Override
    public Integer importUserNew(MultipartFile file) {
        String fileContent = commService.parseExcelByTemplate("PERSONNEL_REGISTER_MIDDLE_IMPORT", file);
        JSONArray jsonArray = JSONArray.parseArray(fileContent);
        Integer num = 0;
        for (Object jsonObj : jsonArray) {
            JSONObject jsonObject = JSONObject.parseObject(jsonObj.toString());
            TbPersonnelRegisterMiddleDTO personnelRegisterMiddleDTO = JSONObject.parseObject(jsonObject.toJSONString(), TbPersonnelRegisterMiddleDTO.class);
            if (!StringUtils.hasText(personnelRegisterMiddleDTO.getCompanyName())
                    || !StringUtils.hasText(personnelRegisterMiddleDTO.getPersonnelScope())
                    || !StringUtils.hasText(personnelRegisterMiddleDTO.getRegistration())){
                continue;
            }
            QueryWrapper<TbPersonnelRegisterMiddle> queryWrapper = Wrappers.query();
            queryWrapper.eq("personnel_scope", personnelRegisterMiddleDTO.getPersonnelScope());
            TbPersonnelRegisterMiddle tbPersonnelRegisterMiddle = personnelRegisterMiddleMapper.selectOne(queryWrapper);
            if (tbPersonnelRegisterMiddle != null) {
                continue;
            }
            tbPersonnelRegisterMiddle = new TbPersonnelRegisterMiddle();
            BeanUtils.copyProperties(personnelRegisterMiddleDTO, tbPersonnelRegisterMiddle);
            List<PtEnumDTO> personnelRangeEnum = getPersonnelRangeEnum();
            Map<String, String> enumMap = personnelRangeEnum.stream().collect(Collectors.toMap(PtEnumDTO::getNameZh, PtEnumDTO::getValue));
            tbPersonnelRegisterMiddle.setPersonnelCode(enumMap.get(personnelRegisterMiddleDTO.getPersonnelScope()));
            num = num + personnelRegisterMiddleMapper.insert(tbPersonnelRegisterMiddle);
            String sapToken = getSapToken();
            asyncSyncDataToHRSS.saveCompanyRegistrationAddress(tbPersonnelRegisterMiddle, sapToken);
        }
        return num;
    }

    @Override
    public List<PtEnumDTO> getPersonnelRangeEnum() {
        PtEnumDTO enumDTO = new PtEnumDTO();
        enumDTO.setAppId("nem-manager");
        enumDTO.setEnumCode("NEW_STAFF_PERSONALRANGENAME");
        JSONObject ptEnumRes = abilityClient.getPtEnum(enumDTO, ptToken);
        List<PtEnumDTO> ptEnumList = JSONObject.parseArray(JSONObject.toJSONString(ptEnumRes.get("data")), PtEnumDTO.class);
        return ptEnumList;
    }

    @Override
    public String getCompanyNameByPersonnelCode(String personnelScope) {
        TbPersonnelRegisterMiddle personnelRegisterMiddle = getOne(new QueryWrapper<TbPersonnelRegisterMiddle>().lambda()
                .eq(TbPersonnelRegisterMiddle::getPersonnelCode, personnelScope));
        if(Objects.isNull(personnelRegisterMiddle)){
            return "";
        }
        return personnelRegisterMiddle.getCompanyName();
    }

    @Override
    public Map<String, String> getCompanyNameByPersonnelCodeList(List<String> personnelScope) {
        if (CollectionUtils.isEmpty(personnelScope)) {
            return new HashMap<>();
        }
        List<TbPersonnelRegisterMiddle> personnelRegisterMiddle = list(new QueryWrapper<TbPersonnelRegisterMiddle>()
                .lambda().in(TbPersonnelRegisterMiddle::getPersonnelCode, personnelScope));
        return personnelRegisterMiddle.stream().collect(Collectors.toMap(TbPersonnelRegisterMiddle::getPersonnelCode,
                TbPersonnelRegisterMiddle::getCompanyName));
    }

    @Override
    public File download(TbPersonnelRegisterMiddleDTO dto, String templateCode, String fileName) {
        List<TbPersonnelRegisterMiddleDTO> personnelRegisterMiddleDTOS=selectFuzzyByDto(dto);
        return commService.generateExportFile(fileName, templateCode, (List)personnelRegisterMiddleDTOS);
    }

}

